/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
import javax.swing.Timer;

/**
 *
 * @author Daniel
 */
public class DTrem extends JComponent implements ActionListener{
    private final Timer timer = new Timer(10, this);
    private int tremNumber = 1, isOccupied;
    private int x1 = 5, y1 = 5, vel1 = 0, x2 = 765, y2 = 545, vel2 = 0;

    @Override
    public void paintComponent(Graphics g){
        //desenhando trilhos e trem
        Graphics2D g2 = (Graphics2D) g;
        Rectangle trem = new Rectangle(x1,y1,10,10);
        Rectangle trem2 = new Rectangle(x2,y2,10,10);
        Rectangle trilho = new Rectangle(10, 10, 760, 540);
        Line2D.Double intersect = new Line2D.Double(380,10,380,550);
        Line2D.Double tunnel1 = new Line2D.Double(375,15,375,545);
        Line2D.Double tunnel2 = new Line2D.Double(385,15,385,545);
        g2.setColor(Color.LIGHT_GRAY);
        g2.draw(intersect);
        g2.setColor(Color.black);
        g2.draw(tunnel1);
        g2.setColor(Color.black);
        g2.draw(tunnel2);
        g2.setColor(Color.black);
        g2.draw(trilho);
        //O trem azul é do "usuário"
        if(tremNumber==1){
            g2.setColor(Color.blue);
            g2.fill(trem);
            g2.setColor(Color.RED);
            g2.fill(trem2);
        }
        //caso o trem do "usuário" seja o da direita
        if(tremNumber==2){
            g2.setColor(Color.RED);
            g2.fill(trem);
            g2.setColor(Color.BLUE);
            g2.fill(trem2);
        }
        timer.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //Movimentação do trem 1
        switch(tremNumber){
            case 1:
                //pequeno teste de lag, caso o trem saia da zona crítica e não
                //mude o estado para desocupado
                if(isOccupied==1&&x1<375)
                    isOccupied=0;
                //caso a zona crítica esteja desocupada o trem vai entrar
                if(isOccupied == 0 || x1<=355)
                    //andando para a esquerda
                    if(x2>=395||x1<=355)
                        if(x1<375&&y1<=5){
                            y1=5;
                            x1 = x1+vel1;
                            if(x1>=375)
                                isOccupied = 1;

                        }
                //andando para baixo
                if(x1>=375){
                    isOccupied = 1;
                    if(y1<=545){
                        x1=375;
                        y1 = y1+vel1;
                    }
                    if(y1>=545) 
                        isOccupied = 0;
                }
                //andando para direita
                if(x1>5&&y1>=545){
                    y1=545;
                    x1 = x1 - vel1;
                }
                //andando para cima
                if(x1<=5&&y1>5){
                    x1=5;
                    y1 = y1 - vel1;
                }
        //Movimentação do trem 2
            case 2:
                //pequeno teste de lag, caso o trem saia da zona crítica e não
                //mude o estado para desocupado
                if(isOccupied==2&&x2>375)
                    isOccupied=0;
                //andando para esquerda
                if(x2<765&&y2<=5){
                    y2=5;
                    x2 = x2+vel2;
                }
                //andando para baixo
                if(x2>=765&&y2<=545){
                    x2=765;
                    y2 = y2+vel2;
                }
                //andando para direita, caso a zona crítica estiver livre ele entra
                if(isOccupied == 0 || x2>395)
                    if(x2>375&&y2>=545){
                        y2=545;
                        x2 = x2 - vel2;
                        if(x2<=375)
                            isOccupied = 2;
                    }
                //andando para cima
                if(x2<=375){
                    isOccupied = 2;
                    if(x2<=375&&y2>5){
                        x2=375;
                        y2 = y2 - vel2;
                    }
                    if(y2<=5) 
                        isOccupied = 0;
                }
        }
        repaint();
    }
//SETTERS AND GETTERS BELLOW

    /**
     *
     * @param x1
     */
        public void setX1(int x1) {
        this.x1 = x1;
    }

    /**
     *
     * @param y1
     */
    public void setY1(int y1) {
        this.y1 = y1;
    }

    /**
     *
     * @param vel1
     */
    public void setVel1(int vel1) {
        this.vel1 = vel1;
    }

    /**
     *
     * @param y2
     */
    public void setY2(int y2) {
        this.y2 = y2;
    }

    /**
     *
     * @param x2
     */
    public void setX2(int x2) {
        this.x2 = x2;
    }

    /**
     *
     * @param vel2
     */
    public void setVel2(int vel2) {
        this.vel2 = vel2;
    }

    /**
     *
     * @param isOccupied
     */
    public void setIsOccupied(int isOccupied) {
        this.isOccupied = isOccupied;
    }

    /**
     *
     * @return
     */
    public int getTremNumber() {
        return tremNumber;
    }

    /**
     *
     * @param tremNumber
     */
    public void setTremNumber(int tremNumber) {
        this.tremNumber = tremNumber;
    }
    
    /**
     *
     * @return
     */
    public String getInfo(){
        if(tremNumber==1){
            return x1+"/"+y1+"/"+vel1+"/"+isOccupied;
        }
        else return x2+"/"+y2+"/"+vel2+"/"+isOccupied;
    }

    /**
     *
     * @return
     */
    public int getIsOccupied() {
        return isOccupied;
    }

    /**
     *
     * @return
     */
    public int getX1() {
        return x1;
    }

    /**
     *
     * @return
     */
    public int getY1() {
        return y1;
    }

    /**
     *
     * @return
     */
    public int getX2() {
        return x2;
    }

    /**
     *
     * @return
     */
    public int getY2() {
        return y2;
    }

  }
